package org.kele.asyncservlet.bean;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Slf4j
@Configuration
public class ServlectBizConfig extends WebMvcConfigurationSupport {


    /**
     * 用于  controller中 Callable<T> 返回类型的；
     */
    @Override
    protected void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        /*
         这个池子用于处理controller接口的业务pool， 初始值要拉高点， 实测相同条件下， 使用异步池的性能，
         相较于基于vertx异步框架的 servicecomb的相差无几； mvc 接口返回值要指定 callable比较繁琐，
          相反 servicecomb 编码更友好写，而且是原生异步框架，不需要过多异步方面的配置
         */
        threadPoolTaskExecutor.setCorePoolSize(400);
        threadPoolTaskExecutor.setMaxPoolSize(400);

        threadPoolTaskExecutor.setBeanName("kele-exec");
        threadPoolTaskExecutor.initialize();

        configurer.setTaskExecutor(threadPoolTaskExecutor)
                .setDefaultTimeout(30000L);
    }
}
